package com.coolingme.classreflect;

import com.coolingme.domain.Person;

import java.util.ArrayList;

/**
 * Class中的常用方法
 *
 * @author wangyue
 * @date 2019/3/15 12:52
 */
public class PersonClassTest {
    public static void main(String[] args) {
        try {
            // 通过一个Class对象来操作Person.class类文件
            // clazz 为内存中的一个对象，与Person类产生映射关系

            // **********
            // 获取Class对象的三种方式：
            // 方式一
            Class clazz = Class.forName("com.coolingme.domain.Person");
            System.out.println("clazz" + clazz.getSimpleName());

            // 方式二
            Class clazz2 = Person.class;
            System.out.println("clazz2" + clazz2.getSimpleName());

            // 方式三
            Person p3 = new Person();
            Class clazz3 = p3.getClass();
            System.out.println("clazz2" + clazz3.getSimpleName());

            // 1.获取类的每一个修饰符 用一个整数来进行表示
            // 从0 开始 0 1 2 4 8 16 .。。
            // 0--默认不写  1--public 2--private 4--protected
            // 8--static    16--final   32--synchronized    64--volatile
            // 128--transient   256--native     512--interface  1024--abstract
            int modifiers = clazz.getModifiers();
            System.out.println(modifiers);

            // 2.获取类的名称
            // 类全名  com.dylan.domain.Person
            String name = clazz.getName();
            // 类简单名     Person
            String simpleName = clazz.getSimpleName();
            System.out.println(name);
            System.out.println(simpleName);

            // 3.获取类所在的包  package com.dylan.domain
            Package p = clazz.getPackage();
            // com.dylan.domain
            System.out.println(p.getName() + '\n');

            // 4.获取超类（父类）
            Class superClass = clazz.getSuperclass();
            // Father
            System.out.println(superClass.getSimpleName() + '\n');

            // 循环获取父类
            ArrayList<String> stringList = new ArrayList<String>();
            Class listClazz = stringList.getClass();
            System.out.println("循环获取父类");
            while (listClazz != null) {
                System.out.println(listClazz.getName());
                // 重新获取父类
                listClazz = listClazz.getSuperclass();
            }

            // 5.获取所有父接口
            listClazz = stringList.getClass();
            Class[] listClazzes = listClazz.getInterfaces();
            System.out.println("获取所有父接口");
            for (Class c : listClazzes) {
                System.out.println(c.getName());
            }

            try {
                // 6.创建类的对象,类型为Object,所以创建具体对象是需要强制转换
                // 默认调用无参的构造方法 来创建对象
                Person person = (Person) clazz.newInstance();
                System.out.println(person + "\n");
            } catch (InstantiationException e) {
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }

            //7.获取内部类，只能获取public类型
            Class[] innerClazzes = clazz.getClasses();
            for (Class c : innerClazzes) {
                System.out.println(c.getSimpleName());
            }


        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
}
